<?php

/**
 * 身份管理器
 *
 */
class JCAT_IdentityManager
{
	
	/**
	 * 通过身份名称取得身份
	 * 
	 * @access	public
	 * @param	$sIdentityName		string	身份名称
	 * @static 
	 * @return	JCAT_IIdentity
	 */
	static public function QueryIdentity($sIdentityName)
	{
		return isset(self::$arrLoginedIdentitys[$sIdentityName])?
					self::$arrLoginedIdentitys[$sIdentityName]:
					null ;
	}

	/**
	 * what's this
	 * 
	 * @access	public
	 * @param	$aIdentity		JCAT_IIdentity		what's this
	 * @static 
	 * @return	old_value
	 */
	static public function IdentityLogin(JCAT_IIdentity $aIdentity)
	{
		$sIdentityName = $aIdentity->GetIdentityClass() ;
		JCAT_ASSERT::ASSERT_($aIdentity->IsLogined(),JCAT_Language::SentenceEx('身份：“%s”尚未完成登录，无法提交到身份管理器。','JCAT',null,$sIdentityName));

		// 已经存在的 身份
		if(isset(self::$arrLoginedIdentitys[$sIdentityName]))
		{
			$old_value = self::$arrLoginedIdentitys[$sIdentityName] ;
			
			// 已存在 先登出
			$old_value->Logout() ;
		}
		else 
		{
			$old_value = null ;
		}
		
		self::$arrLoginedIdentitys[$sIdentityName] = $aIdentity ;
		return $old_value ;
	}
	
	/**
	 * what's this
	 * 
	 * @access	public
	 * @param	$IdentityOrName		JCAT_IIdentity, string		what's this
	 * @static 
	 * @return	void
	 */
	static public function IdentityLogout( $IdentityOrName )
	{
		JCAT_ASSERT::ASSERT_ISTHESE($IdentityOrName,array('string','JCAT_IIdentity'));
		
		if( JCAT_Global::HasImplementedTo($IdentityOrName,'JCAT_IIdentity') )
		{
			$sIdentityName = $IdentityOrName->GetName() ;
		}
		else
		{
			$sIdentityName =& $IdentityOrName ;
		}
		
		unset( self::$arrLoginedIdentitys[$sIdentityName] ) ;
	}
	
	
	
	/**
	 * 认证
	 * 
	 * @access	public
	 * @param	$aAuthorizableObject	JCAT_IAuthorizable
	 * @static 
	 * @return	bool
	 */
	static public function Authenticate(JCAT_IAuthorizable $aAuthorizableObject)
	{
		// anybody
		if( $aAuthorizableObject->Authorize(new JCAT_IdentityAnybody()) )
		{
			return true ;
		}

		// 依次认证用户各项身份
		foreach (self::$arrLoginedIdentitys as $aIdentity)
		{
			if( $aAuthorizableObject->Authorize($aIdentity) )
			{
				return true ;
			}
		}
		
		return false ;
	}
	
	/**
	 * 为所有已登录的 身份对象 创建一个迭代器
	 *
	 * @access	public
	 * @static
	 * @return	JCAT_IIterator
	 */
	static public function CreateIdentityIterator()
	{
		return new JCAT_ArrayIterator(self::$arrLoginedIdentitys) ;
	}
	
	// 属性 ////////////////////////////////////
	
	/**
	 * 已登录的身份
	 * 
	 * @access	private
	 * @var		array:JCAT_IIdentity
	 * @static 
	 */
	static private $arrLoginedIdentitys = array() ;
}

?>
